package forms; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import io.sphere.client.model.SearchResult; import io.sphere.client.shop.model.*; import play.libs.Json; import play.mvc.Call; import play.mvc.Http; import static utils.ControllerHelper.saveFlash; import static utils.ControllerHelper.saveJson; import static utils.ViewHelper.*; public class ListProducts { public ListProducts() { } public static void displaySuccessMessage(SearchResult<Product> search, Category category, String sort) { String message = search.getTotal() + " products found"; saveFlash("total-products-found", message); ObjectNode json = Json.newObject(); json.put("success", message); json.putAll(getJson(search, category, sort)); saveJson(json); } public static ObjectNode getJson(SearchResult<Product> search, Category category, String sort) { ObjectNode json = Json.newObject(); // Pager attributes json.put("offsetProducts", search.getOffset()); json.put("countProducts", search.getCount()); json.put("totalProducts", search.getTotal()); json.put("currentPage", search.getCurrentPage()); json.put("totalPages", search.getTotalPages()); // Next page URL Call url = getProductListUrl(search, sort, category); if (url != null) { json.put("nextPageUrl", url.absoluteURL(Http.Context.current().request())); } // Product list ArrayNode products = json.putArray("product"); int i = search.getOffset(); for (Product product : search.getResults()) { products.add(getJson(product, category, i)); i++; } return json; } public static ObjectNode getJson(Product product, Category category, int position) { Variant masterVariant = product.getMasterVariant(); ObjectNode json = Json.newObject(); json.put("id", product.getId()); json.put("name", capitalizeInitials(product.getName())); json.put("slug", product.getSlug()); json.put("description", product.getDescription()); json.put("isFeatured", position > 1 && Math.random() > 0.9); json.put("variant", getJson(product, masterVariant, category)); json.put("hasMoreColors", hasMoreColors(product)); json.put("hasMoreSizes", hasMoreSizes(product)); // Matching variants if (product.getVariants().size() > 1) { ArrayNode matchVariants = json.putArray("matchVariant"); ObjectNode matchVariant; for (Variant match : getPossibleVariants(product, masterVariant, "color")) { matchVariant = getJson(product, match, category); matchVariant.put("isActive", masterVariant.getId() == match.getId()); matchVariants.add(matchVariant); } } return json; } public static ObjectNode getJson(Product product, Variant variant, Category category) { if (variant.getPrice() == null) return null; ObjectNode json = Json.newObject(); json.put("id", variant.getId()); json.put("productId", product.getId()); json.put("price", printPrice(getPrice(variant))); json.put("url", getProductUrl(product, variant, category).absoluteURL(Http.Context.current().request())); json.put("addCartUrl", controllers.routes.Carts.add().absoluteURL(Http.Context.current().request())); // Images ObjectNode images = Json.newObject(); images.put("thumbnail", getJson(variant.getFeaturedImage(), ImageSize.THUMBNAIL)); images.put("small", getJson(variant.getFeaturedImage(), ImageSize.SMALL)); images.put("medium", getJson(variant.getFeaturedImage(), ImageSize.MEDIUM)); images.put("large", getJson(variant.getFeaturedImage(), ImageSize.LARGE)); images.put("original", getJson(variant.getFeaturedImage(), ImageSize.ORIGINAL)); json.put("image", images); // Matching sizes ArrayNode sizes = json.putArray("size"); for (Variant match : getPossibleVariants(product, variant, "size")) { sizes.add(match.getString("size")); } return json; } public static ObjectNode getJson(Image image, ImageSize size) { ObjectNode images = Json.newObject(); if (!image.isSizeAvailable(size)) return null; ScaledImage scale = image.getSize(size); images.put("url", scale.getUrl()); images.put("width", scale.getWidth()); images.put("height", scale.getHeight()); return images; } }